﻿using System;
using System.Globalization;
using System.Linq;
using System.Text;
using GDM.Hogar.Aplicacion.Formularios;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using Microsoft.Reporting.WinForms;

namespace GDM.Hogar.Aplicacion.Reportes
{
    public partial class FrmPlanillaAsistenciaTaller
#if DEBUG
 : AdaptadorFrm
#else
         : FrmBase
#endif
    {
        private readonly IIntegranteManager _integranteManager;
        private readonly IActividadManager _actividadManager;

        public FrmPlanillaAsistenciaTaller(IIntegranteManager integranteManager, IActividadManager actividadManager)
        {
            if (integranteManager == null)
                throw new ArgumentNullException("integranteManager");
            if (actividadManager == null)
                throw new ArgumentNullException("actividadManager");

            _integranteManager = integranteManager;
            _actividadManager = actividadManager;
            InitializeComponent();
        }

        private void CargarTalleres()
        {
            var actividades = _actividadManager.ObtenerActividades();
            var talleres = actividades.Where(x => x.ActividadId > 2 && x.Activa).ToList();
            cmbTalleres.CargarItems(talleres, "Nombre", "ActividadId", true);
        }

        private void SetearParametrosMeses()
        {
            var mes = DateTime.Now.Month;
            var mes1 = string.Empty;
            var mes2 = string.Empty;
            if (mes > 2)
            {
                var esPar = mes%2 == 0;
                if (esPar)
                {
                    mes1 = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(mes - 1).ToUpper();
                    mes2 = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(mes).ToUpper();
                }
                else
                {
                    mes1 = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(mes).ToUpper();
                    mes2 = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(mes + 1).ToUpper();
                }
            }
            rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Mes1", mes1));
            rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Mes2", mes2));
        }

        private void FrmPlanillaAsistenciaTaller_Load(object sender, EventArgs e)
        {
            CargarTalleres();
            rpAsistenciaTalleres.Messages = new MensajesReportViewer();
            rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Hogar", ContextoHogar.Nombre));
            SetearParametrosMeses();
            if (cmbTalleres.Items.Count > 1)
            {
                cmbTalleres.SelectedIndex = 1;
            }
        }

        private void talleresValidador_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (e.Control == cmbTalleres)
            {
                e.Valid = cmbTalleres.SelectedIndex > 0;
            }
        }

        private string ObtenerDia(int dia)
        {
            return " " + ((DiaSemana)dia).Descripcion();
        }

        private void RefrescarReporteTaller()
        {
            if (cmbTalleres.SelectedIndex > 0)
            {
                var actividad = (ConsultaActividad) cmbTalleres.SelectedItem;
                var integrantes = _integranteManager.AsistenAActividad(actividad.ActividadId);
                var horarios = _actividadManager.ObtenerHorarios(actividad.ActividadId);
                var sb = new StringBuilder();
                var k = 1;
                foreach (var horario in horarios)
                {
                    var horarioCompleto = string.IsNullOrEmpty(horario.HoraComienzo) ? "" : string.Format("{0}-{1}", horario.HoraComienzo, horario.HoraFin);
                    if (string.IsNullOrEmpty(horarioCompleto)) continue;

                    sb.Append(ObtenerDia(horario.DiaSemanaId) + " | " + horarioCompleto);
                    if (k == 2 || k == 4)
                    {
                        sb.Append("\n");
                    }
                    else
                    {
                        sb.Append(" ");
                    }
                    k++;
                }
                const int cantIntegrantesPorPagina = 19;
                var cantPaginas = integrantes.Count / cantIntegrantesPorPagina + 1;
                var totalACompletar = (cantPaginas * cantIntegrantesPorPagina) - integrantes.Count;
                for (var i = 0; i < totalACompletar; i++)
                {
                    integrantes.Add(new IntegranteAsisteActividad());
                }
                rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Taller", actividad.Nombre));
                rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Horario", sb.ToString()));
                rpAsistenciaTalleres.LocalReport.SetParameters(new ReportParameter("Profesor", actividad.Responsable));
                rpAsistenciaTalleres.LocalReport.DataSources.Clear();
                rpAsistenciaTalleres.LocalReport.DataSources.Add(new ReportDataSource("DataSet_IntegranteAsisteActividad", integrantes));
                rpAsistenciaTalleres.RefreshReport();
            }
        }

        private void cmbTalleres_SelectedIndexChanged(object sender, EventArgs e)
        {
            RefrescarReporteTaller();
        }
    }
}
